/* 语法文法：
1）rule Colon ProductionRule+ SemiColon
   * 规则名以<小写字母>开头
2) 上下级嵌套确定AST节点父子关系
3）表达式优先级也可通过上下级嵌套来实现，additive -> child -> multiplicative

4）同时观察antlr4生成的语法分析器源码，发现其分析策略也是自顶向下的递归下降算法，
分析器结构跟语法嵌套文法结构一致，上级算法调用下级算法，上级算法生成上级节点并返回，下级算法生成下级节点并返回，上下级形成父子关系
开始分析时，调用顶级算法program，解析完就返回整个ast

5）ast各节点继承自 ParserRuleContext，名称与自己规则名一致，如 program -- ProgramContext，最终返回的ast也就是该ProgramContext实例
6）ParserRuleContext 维护着当前节点的上下文信息，如 parent, hildren, rule_name 等
7）叶子节点为 TerminalNodeImpl，意为终结节点，维护者 parent, token等
*/

grammar HelloSyntax;  //lexer关键字意味着这是一个词法规则文件，名称是Hello，要与文件名相同

import HelloLexer;

// rule
program
    : expressionStmt+
    ;

expressionStmt
    : forLoopStmt
    | ifStmt
    | intDeclaration Semicolon
    | assignmentExpression Semicolon
    | boolExpression Semicolon
    ;

forLoopStmt
    : For LPAREN intDeclaration Semicolon boolExpression Semicolon assignmentExpression RPAREN LBRACE expressionStmt+ RBRACE
    ;

ifStmt
    : If LPAREN boolExpression RPAREN LBRACE success=expressionStmt+ RBRACE (Else LBRACE faild=expressionStmt+ RBRACE)?
    ;

intDeclaration
    : Int Identifier (Assignment boolExpression)?
    ;

assignmentExpression
    : Identifier Assignment boolExpression
    ;

boolExpression
    : comparision ((And | Or) comparision)*
    ;

comparision
    : additiveEx ((GT | LT | EQ | GE | LE) additiveEx)?
    ;

additiveEx
    : multiplicativeEX ((Plus | Minus) multiplicativeEX)*
    ;

multiplicativeEX
    : primary ((Star | Slash) primary)*
    ;

primary
    : Identifier
    | IntLiteral
    | StringLiteral
    | LPAREN boolExpression RPAREN
    ;
